// 购物车vuex模块

import { 
  getNewCartGoods,
  mergeCart,
  getCartList,
  insertCart,
  deleteCart,
  updateCart,
  checkAllCart 
} from '@/api/cart'

export default {
  // 开启命名空间，彻底分离模块
  namespaced: true,
  state() {
    return {
      // 购物车商品列表
      list: []
    }
  },
  getters: {
    // 有效商品列表
    validList(state) {
      return state.list.filter((item) => item.stock && item.isEffective)
    },
    // 有效商品总件数(p: 上次结果 c: 当前对象)
    validTotal(state,getters) {
      return getters.validList.reduce((p,c) => p + c.count,0)
    },
    // 有效商品总金额
    validAmount(state,getters) {
      return getters.validList.reduce((p,c) => p + c.nowPrice * 100 * c.count, 0) / 100
    },
    // 已选中商品列表
    selectedList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 计算已选中商品件数
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 计算已选中商品总金额
    selectedAmount (state, getters) {
      return getters.selectedList.reduce((p, c) => p + (c.nowPrice * 100 * c.count), 0) / 100
    },
    // 全选状态
    isCheckAll (state, getters) {
      return getters.validList.length === getters.selectedList.length && getters.selectedList.length !== 0
    }
  },
  mutations: {
    insertCart(state,goods) {
      // 如果购物车中已经存在对应的skuId的商品，数量累加
      //（更新数量，添加商品，需要展示在前面）
      const sameIndex = state.list.findIndex(
        (item) => item.skuId === goods.skuId
      )
      if (sameIndex >= 0) {
        // 购物车已经有了，数量累加即可
        goods.count = state.list[sameIndex].count + goods.count
        // 删除之前的商品
        state.list.splice(sameIndex,1)
      }
      state.list.unshift(goods)
    },
    updateCart(state,goods) {
      // 支持购物车数据更新
      const updateGoods = state.list.find(item => item.skuId === goods.skuId)
      for(const key in goods) {
        const value = goods[key] // 需要改的值
        if (value !== null && value !== undefined && value !== '') {
          updateGoods[key] = value
        }
      }
    },
    // 删除商品
    deleteCart(state,skuId) {
      const index = state.list.findIndex((item) => item.skuId === skuId)
      state.list.splice(index,1)
    },
    // 设置购物车列表
    setList(state,list) {
      state.list = list
    }
  },
  actions: {
    async insertCart(ctx,goods) {
      if (ctx.rootState.user.profile.token) {
        // 已登录：调用接口去更新数据 
        // 1. 调用加入购物车API函数
        await insertCart(goods)
        // 2. 拉取服务器购物车列表(调用列表API+调用修改vuex函数)
        await ctx.dispatch('getCartList')
      }else {
        // 未登录：调用mutations更新数据，自动存储本地 
        ctx.commit('insertCart',goods)
      }
    },
    async getCartList(ctx) {
      if (ctx.rootState.user.profile.token) {
        // 已登录：调用接口去更新数据 
        const data = await getCartList()
        ctx.commit('setList',data.result)
      }else {
        // 未登录：调用mutations更新数据，自动存储本地 
        // 每个商品都要更新，都需要调用接口，并发发请求（同时发请求）
        const promiseArr = ctx.state.list.map(item => 
          getNewCartGoods(item.skuId)
        )
        const results = await Promise.all(promiseArr)
        results.forEach((item,i) => {
          ctx.commit('updateCart',{
            skuId:ctx.state.list[i].skuId,
            ...item.result
          })
        })
        // console.log(results);
      }
    },
    async deleteCart(ctx,skuId) {
      if (ctx.rootState.user.profile.token) {
        // 已登录：调用接口去更新数据
        await deleteCart([skuId])
        await ctx.dispatch('getCartList')
      }else {
        // 未登录：调用mutations更新数据，自动存储本地 
        ctx.commit('deleteCart',skuId)
      }
    },
    async updateCart(ctx, goods) {
      if (ctx.rootState.user.profile.token) {
        // 已登录：调用接口去更新数据
        await updateCart(goods)
        await ctx.dispatch('getCartList')
      } else {
        // 未登录
        ctx.commit("updateCart", goods);
      }
    },
    async checkAllCart(ctx, selected) {
      if (ctx.rootState.user.profile.token) {
        // 已登录：调用接口去更新数据
        // 准备有效商品的所有skuId的数组：ids
        const ids = ctx.getters.validList.map((item) => item.skuId)
        await checkAllCart({selected,ids})
        await ctx.dispatch('getCartList')
      } else {
        // 未登录
        ctx.getters.validList.forEach(item => {
          ctx.commit('updateCart',{skuId: item.skuId,selected})
        })
      }
    },
    // 批量删除:
    async batchDeleteCart(ctx) {
      if (ctx.rootState.user.profile.token) {
        // 已登录：调用接口去更新数据
        // 把选中的商品的SKUID组织成数组(ids)
        const ids = ctx.getters.selectedList.map((item) => item.skuId)
        await deleteCart(ids)
        await ctx.dispatch('getCartList')
      } else {
        // 未登录
        ctx.getters.selectedList.forEach(item => {
          ctx.commit('deleteCart',item.skuId)
        })
      }
    },
    // 合并本地购物车
    async mergeCart(ctx) {
      // 准备参数
      const cartList = ctx.getters.validList.map(
        ({skuId,count,selected}) => ({ skuId, count, selected })
      )
       // 参数：[{skuId,count,selected},...]
      await mergeCart(cartList)
      // 清空本地购物车
      ctx.commit('setList',[])
    },
  }
}
